import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例对象
const request = axios.create({
  baseURL: '/api',
  timeout: 30000, // 更合理的超时时间
  // 明确设置响应类型为JSON
  responseType: 'json'
})

// 请求拦截器
request.interceptors.request.use(config => {
  console.log('请求配置:', config)
  // 添加必要的请求头
  config.headers['Content-Type'] = 'application/json'
  config.headers['Accept'] = 'application/json'
  // 添加ngrok跳过浏览器警告的头部
  config.headers['ngrok-skip-browser-warning'] = 'true'
  
  // 对于登录请求，不添加token
  if (!config.url.includes('/user/login')) {
    // 从localStorage中获取loginUser信息，并添加token到请求头
    let loginUser = JSON.parse(localStorage.getItem('loginUser'))
    if (loginUser && loginUser.token) {
      config.headers['token'] = loginUser.token
    }
  }
  return config
}, error => {
  console.error('请求错误:', error)
  ElMessage.error('请求发送失败')
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(response => {
  // 检查响应状态码
  if (response.status >= 200 && response.status < 300) {
    return response
  }
  
  // 状态码不在成功范围内
  ElMessage.error('服务器响应错误: ' + response.status)
  return Promise.reject(new Error('服务器响应错误: ' + response.status))
}, error => {
  console.error('响应错误:', error)
  
  // 处理网络错误
  if (error.code === 'ECONNABORTED') {
    ElMessage.error('请求超时，请检查网络连接')
  } else if (error.message.includes('socket hang up')) {
    ElMessage.error('网络连接异常，请检查服务器状态或网络设置')
  } else if (!error.response) {
    ElMessage.error('网络错误，请检查网络连接')
  } else if (error.response.status === 401) {
    // 处理认证失败的情况
    ElMessage.error('认证失败，请重新登录')
    // 清除本地存储的用户信息
    localStorage.removeItem('loginUser')
    // 跳转到登录页面 (使用动态导入避免循环依赖)
    import('../router').then(routerModule => {
      routerModule.default.push('/login')
    })
  } else if (error.response.status === 403) {
    // 特别处理403错误
    if (error.response.data === 'Invalid CORS request') {
      ElMessage.error('跨域请求被拒绝，请联系管理员检查服务器CORS配置')
    } else {
      ElMessage.error('访问被拒绝，请检查服务器配置或联系管理员')
    }
    console.log('403错误详情:', error.response)
  } else {
    // 检查是否是HTML错误页面
    if (error.response && error.response.data && typeof error.response.data === 'string') {
      if (error.response.data.includes('<html') || error.response.data.includes('<!DOCTYPE')) {
        ElMessage.error('服务器返回了错误页面，请检查代理配置或网络连接')
      } else {
        ElMessage.error('服务器响应错误')
      }
    } else {
      ElMessage.error('服务器响应错误')
    }
  }
  
  return Promise.reject(error)
})

export default request